"""
购物视图层
"""
import logging

from interface import shop_interface
from lib.common import loop_input


def go_shopping(user_dict: dict):
    """商品选购"""
    while True:
        # 打印商品
        goods_info = shop_interface.goods_list_interface()
        print(f" 当前用户:{user_dict['username']}  当前余额: {user_dict['balance']} ".center(30, '*'))
        if not goods_info:
            return

        # 选择商品
        goods_no = loop_input(
            '请输入要购买的商品编号(按q退出):',
            '没有此商品，请重新输入！',
            lambda x, list_len: 0 < int(x) <= list_len if x.isdigit() else x == 'q',
            len(goods_info)
        )
        if goods_no == 'q':
            print('退出商品选购！')
            return
        # 通过商品编号获取商品名
        goods_name = shop_interface.get_goods_through_no(goods_info, goods_no)
        # 输入购买数量
        goods_num = int(loop_input(
            '请输入要购买数量:',
            '输入错误请重新输入！',
            lambda x: x.isdigit(),
        ))
        # 库存不足
        if goods_num > goods_info[goods_name][1]:
            print("商品库存不足，请联系管理员添加库存！")
            input('按回车继续...')
            continue
        print('请选择直接付款还是加入购物车？')
        print('1.付款购买')
        print('2.加入购物车')
        choice = loop_input('请输入选项:', '没有此选项，请重新输入！', lambda x: x in ['1', '2'])
        # 调用商品选购接口
        shop_interface.go_shopping_interface(user_dict, goods_info, goods_name, goods_num, choice)


def check_cart(user_dict: dict):
    """查看购物车"""
    # 打印购物车
    if not shop_interface.shop_cart_list_interface(user_dict):
        print('购物车为空，请先选购商品！')
        return


def cart_management(user_dict: dict):
    """购物车管理"""
    while True:
        # 打印购物车
        if not shop_interface.shop_cart_list_interface(user_dict):
            print('购物车为空，请先选购商品！')
            return
        # 输入选项
        print('1.清空购物车')
        print('2.删除指定商品')
        choice = loop_input(
            '请输入选项(按q退出):',
            '没有选项，请重新输入！',
            lambda x: x in ['1', '2'] if x.isdigit() else x == 'q',
        )

        if choice == 'q':
            print('退出购物车管理！')
            return
        # 清空购物车
        if choice == '1':
            shop_interface.cart_management_interface(user_dict, clear=True)
            print('已清空购物车')
            return
        # 选择商品
        goods_no = int(loop_input(
            '请输入要删除的商品编号:',
            '没有此商品，请重新输入！',
            lambda x, list_len: 0 < int(x) <= list_len if x.isdigit() else False,
            len(user_dict['shop_cart'])
        ))

        # 输入删除数量
        goods_num = int(loop_input(
            '请输入要删除的数量:',
            '输入错误请重新输入！',
            lambda x: x.isdigit(),
        ))
        # 删除超过已有的数量
        if goods_num > user_dict['shop_cart'][goods_no - 1][2]:
            print("购物车商品数量不足！")
            continue
        # 调用购物车管理接口
        shop_interface.cart_management_interface(user_dict, goods_no - 1, goods_num)


def cart_payment(user_dict: dict):
    """购物车结算"""
    while True:
        # 打印购物车
        if not shop_interface.shop_cart_list_interface(user_dict):
            print('购物车为空，请先选购商品！')
            return
        # 输入选项
        print('1.全部结算')
        print('2.结算指定商品')
        choice = loop_input(
            '请输入选项(按q退出):',
            '没有选项，请重新输入！',
            lambda x: x in ['1', '2'] if x.isdigit() else x == 'q',
        )
        if choice == 'q':
            print('退出购物车结算！')
            return
        # 全部结算
        if choice == '1':
            shop_interface.cart_payment_interface(user_dict, all=True)
            print('已清空购物车')
            return

        # 部分结算
        # 结算指定商品
        goods_no = int(loop_input(
            '请输入要结算的商品编号:',
            '没有此商品，请重新输入！',
            lambda x, list_len: 0 < int(x) <= list_len if x.isdigit() else False,
            len(user_dict['shop_cart'])
        ))

        # 输入购买数量
        goods_num = int(loop_input(
            '请输入要购买的数量:',
            '输入错误请重新输入！',
            lambda x: x.isdigit(),
        ))
        if goods_num > user_dict['shop_cart'][goods_no - 1][2]:
            print("购物车商品数量不足！")
            continue
        # 调用购物车结算结算功能
        shop_interface.cart_payment_interface(user_dict, goods_no - 1, goods_num)


src_dict = {
    '1': go_shopping,
    '2': check_cart,
    '3': cart_management,
    '4': cart_payment,
    'q': exit
}


def run(user_dict):
    while True:
        print("欢迎使用 ATM + 购物车 系统".center(40, '*'))
        print("1.商品选购".center(40))
        print("2.查看购物车".center(40))
        print("3.管理购物车".center(40))
        print("4.购物车结算".center(40))
        print(f" 当前用户:{user_dict['username']}  当前余额: {user_dict['balance']} ".center(40, '*'))
        # 输入选项
        order = input('请选择功能（输入q退出系统 exit退出购物车）:').strip()
        # 退出购物车
        if order == 'exit':
            print(f"{user_dict['username']}退出退出购物车")
            logging.getLogger(__name__).info(f"{user_dict['username']}退出退出购物车")
            return
        # 输入错误
        if not src_dict.get(order):
            print('输入的选项不存在，请重新输入！')
            continue
        # 调用功能
        src_dict[order](user_dict)
        input('按回车继续...')
